package lanQiaoBei.搜索与图论.最短路.dijkstra;
import java.io.*;
import java.math.*;
import java.util.*;
/* 朴素版dijkstra算法
*题目描述
给定一个n个点m条边的有向图，图中可能存在重边和自环，所有边权均为正值。

请你求出1号点到n号点的最短距离，如果无法从1号点走到n号点，则输出-1。

输入格式
第一行包含整数n和m。

接下来m行每行包含三个整数x，y，z，表示点x和点y之间存在一条有向边，边长为z。

输出格式
输出一个整数，表示1号点到n号点的最短距离。

如果路径不存在，则输出-1。

数据范围
1≤n≤500,
1≤m≤105,
图中涉及边长均不超过10000。

样例
输入样例：
3 3
1 2 2
2 3 1
1 3 4
输出样例：
3
* */
public class P1 {//据题意可知本题为稠密图所以用邻接矩阵存储图
       static BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
       final static int N=510;
       static int g[][]=new int[N][N],dist[]=new int[N],n,m;
       static boolean[]close=new boolean[N];

       static void scan()throws Exception{
              String[]ss=br.readLine().split(" ");
              n=Integer.parseInt(ss[0]);m=Integer.parseInt(ss[1]);
              for(int i=1;i<=n;i++)
                  Arrays.fill(g[i],0x3f3f3f3f);
              while(m-->0){
                  ss=br.readLine().split(" ");
                  int a=Integer.parseInt(ss[0]),b=Integer.parseInt(ss[1]),c=Integer.parseInt(ss[2]);
                  g[a][b]=Math.min(g[a][b],c);
              }
       }
       static int dijkstra(){
              Arrays.fill(dist,0x3f3f3f3f);
              dist[1]=0;

              for(int i=0;i<n;i++){
                  int t=-1;
                  for(int j=1;j<=n;j++)
                      if(!close[j]&&(t==-1||dist[j]<dist[t]))
                          t=j;

                  close[t]=true;

                  for(int j=1;j<=n;j++)
                      dist[j]=Math.min(dist[j],dist[t]+g[t][j]);
              }
              if(dist[n]==0x3f3f3f3f)return -1;
              else return dist[n];
       }
       public static void main(String[]args)throws Exception{
              scan();
              System.out.print(dijkstra());
       }
}
